﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
// add
using System.IO;
using System.Data;
using System.Collections;

namespace FormBaseLib
{
    /// <summary>
    /// To maintain text file in format of (key=value... list) and UTF-8
    /// Note: It's not an .ini file.
    /// </summary>
    public class CFileKeyValue : CKeyValues, IFileLoadSave
    {
        public string msSeparator { get; set; }
//        CKeyValues mList { get; set; }
        CKeyValues mListBackup { get; set; } 
        //public CItemKeyValue mRow { get; set; }
        public CFileKeyValue()
        {
           
            myInit();
        }
        private void myInit()
        {
            
            //mList = new CKeyValues();
            mListBackup = new CKeyValues();
        }

        public bool HasChanges()
        {
            if (!IsSameAllRows(mListBackup))
                return false;

            return true;

            //CItemKeyValue itemBackup;
            //foreach (CItemKeyValue itemEach in mList)
            //{
            //    if (!mListBackup.Contains(itemEach.msKey))
            //        return true;

            //    itemBackup = mListBackup[itemEach.msKey];
            //    if (String.Compare(itemEach.msValue, itemBackup.msValue) != 0)
            //        return true;
            //}
            //return false;
        }

        //public bool ExistKey(string sKey)
        //{
        //    if (string.IsNullOrEmpty(sKey))
        //        return false;

        //    return mDict.ContainsKey(sKey);
        //}
        //public bool GetValue(string sKey, out string sValue)
        //{
        //    //if (string.IsNullOrEmpty(sKey))
        //    //    return false;

        //    //if (!ExistKey(sKey))
        //    //{
        //    //    sValue = string.Empty;
        //    //    return false;
        //    //}
        //    //sValue = mDict[sKey];
        //    //return true;
        //    return mDict.TryGetValue(sKey, out sValue);
        //}
        //public bool SetValue(string sKey, string sValue)
        //{
        //    if (string.IsNullOrEmpty(sKey))
        //        return false;

        //    if (!mDict.ContainsKey(sKey))
        //        return false;

        //    mDict[sKey] = sValue;
        //    return true;
        //}
        //public bool AddValue(string sKey, string sValue)
        //{
        //    if (string.IsNullOrEmpty(sKey))
        //        return false;

        //    if (ExistKey(sKey))
        //        return false;

        //    mDict.Add(sKey, sValue);
        //    return true;
        //}
        //public string[] GetKeys()
        //{
        //    string[] sa1 = new string[mList.Count];
        //    int i;
        //    i = 0;
        //    foreach (CItemKeyValue itemP in mList)
        //    {
        //        sa1[i] = itemP.msKey;
        //        i++;
        //    }
        //    return sa1;
        //}
        //private CDatasetKeyValue CopyTo()
        //{
        //    CDatasetKeyValue dsNew = new CDatasetKeyValue();

        //    dsNew.msFile = msFile;
        //    foreach (CItemKeyValue itemP in mList)
        //    {
        //        dsNew.mRow.FKey = itemP.msKey;
        //        dsNew.mRow.FValue = itemP.msValue;
        //        if (!dsNew.RowCreate(true))
        //            SetLastError(dsNew.msLastError + ", key=" + itemP.msKey);
        //    }
        //    return dsNew;
        //}
        //public DataTable GetDataTable()
        //{
        //    DataTable table1 = myCreateTableDictionary();

        //    DataRow row1;
        //    foreach (KeyValuePair<string, string> kvp in mDict)
        //    {
        //        row1 = table1.NewRow();
        //        row1[0] = kvp.Key;
        //        row1[1] = kvp.Value;
        //        table1.Rows.Add(row1);
        //    }
        //    return table1;
        //}
        //private DataTable myCreateTableDictionary()
        //{
        //    DataTable table1 = new DataTable("TDictionary");
        //    DataColumn[] cols = {
        //                            new DataColumn("FKey", typeof(String)),
        //                            new DataColumn("FValue", typeof(String))
        //                        };
        //    table1.Columns.AddRange(cols);
        //    table1.PrimaryKey = new DataColumn[] { table1.Columns["FKey"] };
        //    return table1;
        //}
        //private bool CRUD()
        //{
        //    // Create
        //    // Read
        //    // Update
        //    // Delete
        //    return false;
        //}



        #region IFileLoadSave Members

        public string msFile
        {
            get; set;
        }

        public bool FileLoad()
        {
            string sLine;
            //string[] saLine;
            //char[] caSeparator = new char[] { '=' };
            int iColCount;
            //CItemKeyValue itemQ;

            if (string.IsNullOrEmpty(msSeparator))
                msSeparator = "=";


            DeleteAllRows();
            if (!File.Exists(msFile))
            {
                SetLastError(enumErrorNo.ErrorNotExist, string.Format("File doest not exist. file={0}.", msFile));
                return false;
            }

            //            int iLenKey, iLenValue;
            using (StreamReader sr = new StreamReader(msFile, Encoding.UTF8))
            {
                while (!sr.EndOfStream)
                {
                    //saLine = sLine.Split(caSeparator, 2); // only left and right string.
                    //if (saLine.Count() > 1)
                    //{
                    //    mList.mRow.set
                    //    mList.msKey = saLine[0];
                    //    mList.msValue = saLine[1];
                    //    if (!mList.Create())
                    //    {
                    //        // don't care, but noted!
                    //        SetLastError(mList);
                    //    }
                    //}                    sLine = sr.ReadLine();
                    sLine = sr.ReadLine();
                    ////iColCount = mRow.SetFromStringSeparator(sLine, '=');
                    //iColCount = mRow.SetFromStringSeparator(sLine, msSeparator[0]);
                    //if (iColCount > 1)
                    //{
                    //    if (!Create())
                    //    {
                    //        // don't care, but logged.
                    //        //return false;
                    //        SetLastError(mList.mBase);
                    //    }
                    //}
                    iColCount = CreateFromStringSeparator(sLine, msSeparator);
                    if (iColCount<1)
                    { 
                        // don't care.
                    }                            

                }
            }

            //mListBackup.Clear();
            //foreach (CItemKeyValue itemP in mList)
            //    mListBackup.Add(new CItemKeyValue(itemP.msKey, itemP.msValue));

            mListBackup.SetAllRows(this);


            return true;
        }

        public bool FileSave()
        {
            throw new NotImplementedException();
        }

        #endregion


    }

}
